﻿#pragma once

#include <QPlainTextEdit>
#include <QtCore/QRegExp>
#include <QtGui/QSyntaxHighlighter>

namespace Domy {

class MessageSearchHighlighter;
/**
 * @brief The MessageBrowser class
 * @note  消息浏览器
 */
class MessageBrowser : public QPlainTextEdit
{
    Q_OBJECT
public:
    explicit MessageBrowser(QWidget *parent = Q_NULLPTR);
    ~MessageBrowser();

    /**
     * @brief findText
     * @note  查找文本
     * @param text              文本
     * @param is_case_sensitive 大小写敏感
     * @param is_whole_word     整词
     */
    void findText(const QString &text, bool is_case_sensitive, bool is_whole_word);

    /**
     * @brief findNext
     * @note  查找下一个
     * @param text              查找文本
     * @param is_case_sensitive 大小写敏感
     * @param is_whole_word     整词
     */
    bool findNext(const QString &text, bool is_case_sensitive, bool is_whole_word);

    /**
     * @brief findPrevious
     * @note  查找前一个
     * @param text              查找文本
     * @param is_case_sensitive 大小写敏感
     * @param is_whole_word     整词
     */
    bool findPrevious(const QString &text, bool is_case_sensitive, bool is_whole_word);

    /**
     * @brief clearFindResult
     * @note  清除查找结果
     */
    void clearFindResult();

    /**
     * @brief getSelectedText
     * @note  获取选中的文本
     */
    QString getSelectedText() const;

    /**
     * @brief zoomViewIn
     * @note  放大
     */
    void zoomViewIn();

    /**
     * @brief zoomViewOut
     * @note  缩小
     */
    void zoomViewOut();

    /**
     * @brief zoomViewReset
     * @note  重置缩放比例
     */
    void zoomViewReset();

signals:
    /**
     * @brief signalZoomChanged
     * @note  缩放倍数改变
     */
    void signalZoomChanged(int zoom);

protected:
    virtual void wheelEvent(QWheelEvent *e) override;

private slots:
    /**
     * @brief slotOnCustomContextMenuRequest
     * @note  右键菜单
     * @param pos 位置
     */
    void slotOnCustomContextMenuRequest(const QPoint &pos);

private:
    /**
     * @brief getFindFlags
     * @note  获取查找标识
     * @param is_backward       反向查找
     * @param is_case_sensitive 大小写敏感
     * @param is_whole_word     整词
     */
    QTextDocument::FindFlags getFindFlags(bool is_backward, bool is_case_sensitive, bool is_whole_word);

    /**
     * @brief triggerZoomChange
     * @note  触发缩放改变
     */
    void triggerZoomChange();

private:
    int m_zoom;
    MessageSearchHighlighter *m_highlighter;
};

/**
 * @brief The MessageSearchHighlighter class
 * @note  消息搜索高亮
 */
class MessageSearchHighlighter : public QSyntaxHighlighter
{
public:
    explicit MessageSearchHighlighter(QObject *parent = Q_NULLPTR);
    ~MessageSearchHighlighter();

    /**
     * @brief setSearchHighlight
     * @note  设置搜索高亮
     * @param text              查找文本
     * @param is_case_sensitive 大小写敏感
     * @param is_whole_word     整词
     */
    void setSearchHighlight(const QString &text, bool is_case_sensitive, bool is_whole_word);

    /**
     * @brief clearSearchHighlight
     * @note  清除搜索高亮
     */
    void clearSearchHighlight();

protected:
    virtual void highlightBlock(const QString &text) override;

private:
    QRegExp         m_search_exp;
    QTextCharFormat m_search_format;
};

} // namespace Domy
